<?php

namespace app\api\validate;

use app\common\enum\ChannelEnum;
use tmcore\base\BaseValidate;
use tmcore\utils\Helper;

/**
 * 登录验证器
 */
class LoginValidate extends BaseValidate
{
    protected $rule = [
        'channel' => 'require|in:' . ChannelEnum::WX_AP . ',' . ChannelEnum::WX_OA . ',' . ChannelEnum::H5 . ',' . ChannelEnum::PC,
        'account' => 'require|checkAccount',
        'password' => 'require|checkPassword',
        'mobile' => 'require|checkMobile',
        'login_type' => 'require|in:1,2|checkLogin',
        'code' => 'require',
        'url' => 'require',
    ];

    protected $message = [
        'channel.require' => '请输入渠道',
        'account.require' => '请输入账号',
        'password.require' => '请输入密码',
        'mobile.require' => '请输入手机号',
        'login_type.require' => '请输入登录类型',
        'code.require' => '请输入code',
        'url.require' => '请输入跳转路径',
    ];

    /**
     * 登录场景
     * @return LoginValidate
     */
    public function sceneLogin()
    {
        return $this->only(['login_type','channel'])->append('login_type', 'checkLogin');
    }

    /**
     * 注册场景
     * @return LoginValidate
     */
    public function sceneRegister()
    {
        return $this->only(['channel','account','password','mobile','code'])
            ->append('account', 'checkAccount')
            ->append('password', 'checkPassword')
            ->append('mobile', 'checkMobile');
    }

    /**
     * 忘记密码
     * @return LoginValidate
     */
    public function sceneForgetPassword()
    {
        return $this->only(['password','mobile','code'])
            ->append('password', 'checkPassword')
            ->append('mobile', 'checkMobile');
    }

    /**
     * 获取跳转路径
     * @return LoginValidate
     */
    public function sceneUrl()
    {
        return $this->only(['url']);
    }

    /**
     * 微信登录检验
     * @return LoginValidate
     */
    public function sceneWxLogin() {
        return $this->only(['channel','code']);
    }

    /**
     * 检查登录
     * @param $value
     * @param $rule
     * @param $data
     * @return bool|string
     */
    public function checkLogin($value, $rule, $data) {
        if($data['login_type'] == 1) {
            if(empty($data['account'])) return '账号不能为空';
            if(!Helper::check_name($data['account'])) return '账号必须6-20位字符，只能包含数字、字母、下划线';
            if(empty($data['password'])) return '密码不能为空';
            if(!Helper::check_password($data['password'])) return '密码必须6-16位，同时包含字母、数字、特殊符号';
        } else {
            if(empty($data['mobile'])) return '手机号不能为空';
            if(!Helper::check_mobile($data['mobile'])) return '手机号不符合要求';
            if(empty($data['code'])) return '验证码不能为空';
        }
        return true;
    }

    /**
     * 检查账号
     * @param $value
     * @param $rule
     * @param $data
     * @return bool|string
     */
    public function checkAccount($value, $rule, $data) {
        // 6-20位字符，必须以字母开头，只能包含数字、字母、下划线，不区分大小写
        if(!Helper::check_name($value)) return '账号必须6-20位字符，只能包含数字、字母、下划线';
        return true;
    }

    /**
     * 检查密码
     * @param $value
     * @param $rule
     * @param $data
     * @return bool|string
     */
    public function checkPassword($value, $rule, $data) {
        // 6-16位，同时包含字母、数字、特殊符号
        if(!Helper::check_password($value)) return '密码必须6-16位，同时包含字母、数字、特殊符号';
        return true;
    }

    /**
     * 检查手机号
     * @param $value
     * @param $rule
     * @param $data
     * @return bool|string
     */
    public function checkMobile($value, $rule, $data) {
        if(!Helper::check_mobile($value)) return '手机号不符合要求';
        return true;
    }
}